package com.itheima.stargraph.config;

import com.itheima.stargraph.interceptor.WebscoketUserInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

/**
 * websocket 配置类
 * 这个配置类实现了WebSocketMessageBrokerConfigurer接口，
 * 以定制STOMP（Simple Text Oriented Messaging Protocol）端点、消息代理以及客户端入站通道的行为
 */
@Configuration
@EnableWebSocketMessageBroker//启用 WebSocket 消息代理功能
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    /**
     *注册一个或多个STOMP端点，客户端可以通过这些端点建立WebSocket连接
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws") //这是WebSocket连接的URL路径
                .addInterceptors(new HttpSessionHandshakeInterceptor())//它会将HTTP会话信息附加到WebSocket会话中
                .setAllowedOriginPatterns("*");//允许跨域访问
    }

    /**
     * 配置消息代理，用于处理和分发消息给订阅者
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        /**
         * enableSimpleBroker：启用简单的内存消息代理，适用于开发和测试环境
         * "/topic" 和 "/user"：这两个前缀标识了不同的消息目的地。/topic通常用于广播消息，而/user则用于向特定用户发送消息
         */
        registry.enableSimpleBroker("/topic","/user");
    }

    /**
     * 配置客户端入站通道，即从客户端接收消息的通道。
     * @param registry
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registry) {
        //把我们自定义的拦截器加入到websocket的拦截器链中
        registry.interceptors(new WebscoketUserInterceptor());
    }
}